Spring Caching হল স্প্রিং ফ্রেমওয়ার্কের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা অ্যাপ্লিকেশন পারফরম্যান্স উন্নত করতে সাহায্য করে। এটি অ্যাপ্লিকেশনের মধ্যে ডেটা ক্যাশিংয়ের মাধ্যমে অতিরিক্ত ডাটাবেস বা রিসোর্স কল কমাতে সক্ষম করে, যার ফলে অ্যাপ্লিকেশনটির রেসপন্স টাইম দ্রুত হয় এবং সার্ভারের লোড কমে।
এখানে আমরা Spring Caching এবং Performance Optimization নিয়ে বিস্তারিত আলোচনা করব।
Spring Caching কি?
Spring Caching হল একটি অ্যাপ্লিকেশন উন্নয়ন পদ্ধতি যা ডেটা বা রিসোর্সের পুনরায় ব্যবহারযোগ্য অংশগুলিকে ক্যাশে সংরক্ষণ করে, যাতে পরবর্তী সময়ে সেই ডেটার জন্য পুনরায় ডাটাবেস বা অন্য কোন সিস্টেমের সাথে যোগাযোগ করার প্রয়োজন না পড়ে। এটি খুবই কার্যকরী যখন ডেটার জন্য বার বার একে অপরকে কল করার প্রয়োজন হয় এবং ডেটা বার বার পরিবর্তিত না হয়।
স্প্রিং সিকিউরিটি, স্প্রিং ডেটা, এবং স্প্রিং ব্যাচের মত বিভিন্ন স্প্রিং ফিচারে ক্যাশিং সমর্থিত। Spring Caching আপনাকে বিভিন্ন ক্যাশিং স্টোর যেমন In-memory cache, Redis, EhCache, JCache, ইত্যাদি ব্যবহার করতে সহায়তা করে।
Spring Caching এর মূল বৈশিষ্ট্য
- Speed up Application: ক্যাশিং ব্যবহারের মাধ্যমে অ্যাপ্লিকেশনটির পারফরম্যান্স দ্রুত হয় কারণ কম সময়ে ডেটা পাওয়া যায়।
- Reduces Database Load: ক্যাশে ডেটা থাকলে ডাটাবেসে নতুন রিকোয়েস্ট পাঠানোর প্রয়োজন হয় না।
- Improves Scalability: ক্যাশিং ওয়েব অ্যাপ্লিকেশনের স্কেলেবিলিটি উন্নত করে, কারণ ডাটাবেস সার্ভারের উপর চাপ কমে যায়।
Spring Caching Enable এবং Configuration
স্প্রিং ক্যাশিং সক্রিয় করতে প্রথমে আপনাকে @EnableCaching অ্যানোটেশনটি আপনার কনফিগারেশন ক্লাসে যোগ করতে হবে।
Step 1: Maven Dependency
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
Step 2: Enable Caching
@Configuration
@EnableCaching
public class CacheConfig {
}
এখানে @EnableCaching অ্যানোটেশনটি স্প্রিং কনটেইনারে ক্যাশিং সক্ষম করে।
Step 3: Define a Cache Manager
স্প্রিং ক্যাশিংয়ের জন্য সাধারণত CacheManager কনফিগার করা হয়, যেটি ক্যাশিং অপারেশন পরিচালনা করে।
@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager("employees");
}
এখানে ConcurrentMapCacheManager ব্যবহার করা হয়েছে যা ইন-মেমরি ক্যাশ ম্যানেজার। আপনি Redis বা অন্যান্য ক্যাশ স্টোরও ব্যবহার করতে পারেন।
Caching Annotations
স্প্রিং ক্যাশিং প্রধানত কিছু অ্যানোটেশন দিয়ে পরিচালিত হয়। কিছু প্রধান ক্যাশিং অ্যানোটেশন হলো:
- @Cacheable: এই অ্যানোটেশনটি মেথডের রিটার্ন ভ্যালুকে ক্যাশে রাখে। এটি ক্যাশে থাকলে মেথডটি পুনরায় চালানো হয় না, বরং ক্যাশ থেকে রিটার্ন করা হয়।
Example:
@Cacheable("employees") public Employee getEmployeeById(Long id) { // Code to fetch employee details from database }
- @CachePut: এই অ্যানোটেশনটি মেথডটি ক্যাশে আপডেট করতে ব্যবহৃত হয়। এটি ক্যাশে থাকা ডেটা পরিবর্তন করার জন্য ব্যবহৃত হয়।
Example:
@CachePut(value = "employees", key = "#employee.id") public Employee updateEmployee(Employee employee) { // Code to update employee details in the database return employee; }
- @CacheEvict: এই অ্যানোটেশনটি ক্যাশে থেকে ডেটা মুছে ফেলার জন্য ব্যবহৃত হয়। এটি বিশেষভাবে কার্যকরী যখন ডেটা পরিবর্তন হয় বা অপসারণ হয়।
Example:
@CacheEvict(value = "employees", allEntries = true) public void deleteAllEmployees() { // Code to delete all employee details from the database }
- @Caching: একাধিক ক্যাশ অপারেশন একত্রে প্রয়োগ করার জন্য @Caching অ্যানোটেশন ব্যবহার করা হয়।
Example:
@Caching(evict = { @CacheEvict(value = "employees", allEntries = true) }, put = { @CachePut(value = "employees", key = "#employee.id") }) public Employee saveEmployee(Employee employee) { // Code to save employee details in the database return employee; }
Performance Optimization with Caching
স্প্রিং ক্যাশিং ব্যবহারের মাধ্যমে অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করা যায়। ক্যাশিং ডেটার অ্যাক্সেস টাইম দ্রুত করে, ফলে রেসপন্স টাইম কমে এবং সার্ভারের লোড কমে। এটি স্পেশালি ব্যবহারী হিসেবে read-heavy অ্যাপ্লিকেশন বা ওয়েব সার্ভিসের জন্য উপকারী।
Performance Example with In-Memory Caching:
@Cacheable("productCache")
public Product getProductById(Long id) {
// Simulate time-consuming database call
return productRepository.findById(id);
}
এখানে, getProductById() মেথড প্রথমবার চালানোর সময় ডেটাবেস থেকে ডেটা আনা হবে। কিন্তু পরবর্তী সময়ে একই id রিকোয়েস্ট আসলে ক্যাশ থেকে ডেটা সরবরাহ করা হবে, ফলে ডাটাবেস কল কমে যাবে এবং রেসপন্স টাইম দ্রুত হবে।
Using External Caching Solutions (Redis)
স্প্রিং ক্যাশিং শুধু ইন-মেমরি ক্যাশ নয়, এর সাথে Redis, EhCache, এবং Hazelcast এর মতো এক্সটার্নাল ক্যাশ সল্যুশনও সহজেই ইন্টিগ্রেট করা যায়। Redis বিশেষ করে উচ্চ লোড এবং ডিসট্রিবিউটেড ক্যাশিংয়ের জন্য ব্যবহৃত হয়।
Example with Redis Caching:
Add Redis Dependency:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>Enable Redis Cache:
@Configuration @EnableCaching public class RedisCacheConfig { @Bean public RedisCacheManager cacheManager(RedisTemplate<Object, Object> redisTemplate) { RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.builder(redisTemplate); return builder.build(); } }Use Redis Cache:
@Cacheable(value = "products", key = "#productId") public Product getProductById(Long productId) { return productRepository.findById(productId); }
এখানে, RedisCacheManager ব্যবহার করে Redis ক্যাশিং কনফিগার করা হয়েছে এবং ক্যাশে ডেটা সেভ করা হচ্ছে।
Conclusion
Spring Caching একটি অত্যন্ত কার্যকরী পদ্ধতি, যা অ্যাপ্লিকেশনের পারফরম্যান্স অপটিমাইজেশন এবং সার্ভারের লোড কমানোর জন্য ব্যবহৃত হয়। Caching ডেটা পুনরায় ব্যবহার করার মাধ্যমে অ্যাপ্লিকেশনটি দ্রুত করে এবং পরবর্তী সময়ে পুনরায় একই ডেটা ফেচ করার জন্য অতিরিক্ত রিকোয়েস্ট করা হয় না। এটি In-memory cache (যেমন ConcurrentMapCacheManager) বা Redis এর মতো এক্সটার্নাল ক্যাশ সল্যুশনেও সহজে কনফিগার করা যায়। স্প্রিং কনফিগারেশন, ক্যাশিং অ্যানোটেশন, এবং বিভিন্ন ক্যাশ ম্যানেজারের মাধ্যমে স্প্রিং ক্যাশিং আপনার অ্যাপ্লিকেশনকে আরও দ্রুত এবং স্কেলেবল করতে সাহায্য করে।
Spring Caching হলো স্প্রিং ফ্রেমওয়ার্কের একটি ফিচার, যা ডেটা ক্যাশ (Cache) করে অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করতে সাহায্য করে। ক্যাশিং মূলত ডেটা পুনরায় রিকোয়েস্ট না করে আগে থেকে সংরক্ষিত ডেটা প্রদান করে কার্যকারিতা বাড়ায়।
স্প্রিং ক্যাশিং কেন ব্যবহার করবেন?
- Performance Optimization:
- ডাটাবেস বা API কলের লেটেন্সি কমায়।
- Resource Efficiency:
- বারবার একই ডেটা প্রসেস করার প্রয়োজন নেই।
- ইনটিগ্রেশন সহজ:
- Spring Caching বিভিন্ন ক্যাশিং প্রযুক্তি (EHCache, Hazelcast, Redis) সাপোর্ট করে।
- ডেটা পুনরায় ব্যবহার:
- Frequently accessed ডেটা ক্যাশে সংরক্ষণ করে দ্রুত অ্যাক্সেস নিশ্চিত করে।
Spring Caching এর প্রধান Annotation
- @Cacheable: ডেটাকে ক্যাশে সংরক্ষণ করার জন্য ব্যবহৃত হয়।
- @CacheEvict: ক্যাশ থেকে ডেটা মুছে ফেলার জন্য ব্যবহৃত হয়।
- @CachePut: মেথড এক্সিকিউশনের পরে ক্যাশ আপডেট করতে ব্যবহৃত হয়।
- @Caching: একাধিক ক্যাশিং অপারেশন একত্রে সংজ্ঞায়িত করার জন্য ব্যবহৃত হয়।
- @EnableCaching: ক্যাশিং সক্রিয় করার জন্য ব্যবহৃত হয়।
উদাহরণ: Spring Caching ব্যবহার
Step 1: Maven ডিপেনডেন্সি
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
Step 2: Configuration ক্লাস তৈরি
AppConfig.java
@Configuration
@EnableCaching
public class AppConfig {
// Simple Cache Manager (In-Memory Cache) ব্যবহার
@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager("employees");
}
}
Step 3: Service ক্লাস তৈরি
EmployeeService.java
@Service
public class EmployeeService {
private static final Map<Integer, String> database = Map.of(
1, "John Doe",
2, "Jane Doe",
3, "Alice Smith"
);
// ক্যাশে ডেটা সংরক্ষণ
@Cacheable("employees")
public String getEmployeeById(int id) {
simulateSlowService();
return database.getOrDefault(id, "Employee Not Found");
}
// ক্যাশ থেকে ডেটা মুছে ফেলা
@CacheEvict(value = "employees", key = "#id")
public void removeEmployeeFromCache(int id) {
System.out.println("Cache evicted for employee ID: " + id);
}
private void simulateSlowService() {
try {
Thread.sleep(3000); // স্লো প্রসেসিং সিমুলেশন
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
Step 4: Controller তৈরি
EmployeeController.java
@RestController
@RequestMapping("/employees")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@GetMapping("/{id}")
public String getEmployee(@PathVariable int id) {
return employeeService.getEmployeeById(id);
}
@DeleteMapping("/{id}")
public String evictCache(@PathVariable int id) {
employeeService.removeEmployeeFromCache(id);
return "Cache evicted for employee ID: " + id;
}
}
Step 5: অ্যাপ্লিকেশন রান করা
MainApplication.java
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}
আউটপুট
ডেটা ফেচিং: প্রথমবার
/employees/1হিট করলে ৩ সেকেন্ড সময় লাগবে। দ্বিতীয়বার একই রিকোয়েস্ট করলে ক্যাশ থেকে ডেটা আসবে।Request 1: "John Doe" (3 সেকেন্ড) Request 2: "John Doe" (তাৎক্ষণিক)ক্যাশ মুছে ফেলা:
/employees/1এর জন্য ক্যাশ ইভিক্ট করলে আবার নতুন করে ডেটা লোড হবে।Cache evicted for employee ID: 1
ব্যাখ্যা
- @Cacheable:
- প্রথমবার মেথড কল হলে রিটার্ন ভ্যালু ক্যাশে সংরক্ষণ করা হয়।
- পরবর্তী রিকোয়েস্টে একই ডেটা ক্যাশ থেকে প্রদান করা হয়।
- @CacheEvict:
- নির্দিষ্ট ক্যাশ এন্ট্রি মুছে ফেলা হয়।
- SimulateSlowService:
- স্লো প্রসেসিং দেখানোর জন্য ৩ সেকেন্ডের বিলম্ব যোগ করা হয়েছে।
- CacheManager:
- Spring In-Memory Cache ব্যবহার করা হয়েছে।
Spring Caching এর গুরুত্বপূর্ণ টিপস
- ক্যাশ সাইজ নিয়ন্ত্রণ করুন:
- বড় ক্যাশ ডেটা ব্যবহার করলে মেমোরি সমস্যার সম্ভাবনা থাকে।
- TTL (Time-to-Live):
- ক্যাশ ডেটা স্বয়ংক্রিয়ভাবে পুরানো হওয়ার জন্য TTL সেট করুন।
- কাস্টম ক্যাশিং স্টোরেজ:
- প্রোডাকশন অ্যাপ্লিকেশনের জন্য Redis বা EhCache ব্যবহার করুন।
- ডিবাগিং সহজ করুন:
- ক্যাশিং সম্পর্কিত সমস্যাগুলো ডিবাগ করতে লগিং ব্যবহার করুন।
উপসংহার
Spring Caching অ্যাপ্লিকেশনের পারফরম্যান্স বাড়াতে সাহায্য করে। এটি সহজে @Cacheable এবং @CacheEvict এর মাধ্যমে ডেটা ক্যাশ এবং মুছে ফেলার কার্যক্রম পরিচালনা করতে পারে। সঠিক ক্যাশিং ব্যবস্থাপনা অ্যাপ্লিকেশনকে আরও কার্যকর এবং দ্রুতগামী করে তোলে।
Spring Framework দিয়ে ডেভেলপমেন্ট করা অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করার জন্য কিছু কার্যকর টিপস এবং কৌশল রয়েছে। এদের সঠিক প্রয়োগ অ্যাপ্লিকেশনকে আরও দ্রুত, দক্ষ এবং স্থিতিশীল করে তোলে।
১. IoC কনটেইনার অপ্টিমাইজেশন
Bean Scope নির্বাচন
- Singleton: প্রায়শই ব্যবহৃত বীনের জন্য Singleton স্কোপ ব্যবহার করুন। এটি ডিফল্ট স্কোপ এবং মেমোরি ব্যবহারে কার্যকর।
- Prototype: শুধুমাত্র প্রয়োজন হলে ব্যবহার করুন, কারণ এটি প্রতিবার নতুন ইনস্ট্যান্স তৈরি করে।
উদাহরণ:
@Component
@Scope("singleton") // Default
public class MyBean { }
Bean Initialization
- Lazy Initialization: প্রয়োজন না হলে বীনের ইনস্ট্যান্সিয়েশন এড়িয়ে চলুন।
@Lazyঅ্যানোটেশন ব্যবহার করে বীনের ইনিশিয়ালাইজেশন বিলম্বিত করা যায়।
উদাহরণ:
@Component
@Lazy
public class LazyBean { }
Profile-Based Configuration
প্রোডাকশন, ডেভেলপমেন্ট এবং টেস্টিং পরিবেশের জন্য আলাদা কনফিগারেশন ব্যবহার করুন।
উদাহরণ:
@Profile("production")
@Configuration
public class ProductionConfig { }
২. ডেটাবেস অপ্টিমাইজেশন
Connection Pooling
ডেটাবেস কানেকশনের কার্যকারিতা বাড়ানোর জন্য Connection Pooling ব্যবহার করুন। Spring Boot অ্যাপ্লিকেশন সাধারণত HikariCP পুল ব্যবহার করে, যা দ্রুত এবং কার্যকর।
উদাহরণ (application.properties):
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5
Query Optimization
- SQL কোয়েরি অপ্টিমাইজ করুন। জটিল কোয়েরি এড়িয়ে চলুন।
- Named Parameters ব্যবহার করুন কোয়েরি পুনঃব্যবহারযোগ্য করতে।
JdbcTemplate উদাহরণ:
String sql = "SELECT * FROM users WHERE id = :id";
MapSqlParameterSource params = new MapSqlParameterSource("id", userId);
jdbcTemplate.queryForObject(sql, params, new BeanPropertyRowMapper<>(User.class));
Caching
Frequently Accessed ডেটার জন্য ক্যাশিং ব্যবহার করুন। Spring Cache ব্যবহার করা যেতে পারে।
উদাহরণ:
@EnableCaching
@Service
public class UserService {
@Cacheable("users")
public User getUserById(Long id) {
// Database query
}
}
৩. AOP এবং Logging অপ্টিমাইজেশন
Logging Configuration
অতিরিক্ত বা অপ্রয়োজনীয় লগিং এড়িয়ে চলুন। Logging লেভেল INFO বা WARN রাখুন।
application.properties উদাহরণ:
logging.level.org.springframework=INFO
Asynchronous Logging
লগিং পারফরম্যান্স উন্নত করার জন্য Async Logging ব্যবহার করুন।
logback-spring.xml উদাহরণ:
<configuration>
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="FILE"/>
</appender>
</configuration>
৪. Spring MVC অপ্টিমাইজেশন
Content Compression
রিসপন্সের সাইজ কমানোর জন্য GZIP ব্যবহার করুন।
application.properties:
server.compression.enabled=true
server.compression.mime-types=application/json,application/xml,text/html,text/plain
Thread Pool Configuration
Spring MVC থ্রেড পুল সাইজ কাস্টমাইজ করে সিস্টেম লোড ব্যালেন্স করুন।
application.properties:
server.tomcat.threads.max=200
server.tomcat.threads.min-spare=10
৫. Spring Boot স্টার্টআপ টাইম কমানো
Actuator Endpoints সীমিত করা
Spring Boot Actuator এর অপ্রয়োজনীয় এন্ডপয়েন্টগুলো বন্ধ করুন।
application.properties:
management.endpoints.web.exposure.exclude=*
Spring Boot DevTools
Development পরিবেশে Spring Boot DevTools ব্যবহার করুন। তবে, প্রোডাকশনে এটি এড়িয়ে চলুন।
pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
৬. Spring Security অপ্টিমাইজেশন
Stateless Authentication
Stateless অথেন্টিকেশন (যেমন JWT) ব্যবহার করুন, যা সার্ভারের সেশন ব্যবস্থাপনা কমিয়ে আনে।
JWT উদাহরণ:
http.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
URL Pattern Matching
Spring Security-তে সুনির্দিষ্ট URL Matching ব্যবহার করুন। এভাবে সিস্টেম দ্রুত কাজ করতে পারে।
উদাহরণ:
http.authorizeRequests()
.antMatchers("/public/**").permitAll()
.anyRequest().authenticated();
৭. প্যারালাল এবং এসিঙ্ক্রোনাস প্রসেসিং
Async Processing
Spring Framework-এ @Async ব্যবহার করে প্রসেসিং প্যারালাল করা যায়।
উদাহরণ:
@EnableAsync
@Service
public class AsyncService {
@Async
public void performTask() {
// Time-consuming task
}
}
Scheduled Tasks
ব্যাচ জব বা পুনরাবৃত্ত কার্যক্রমের জন্য Spring Scheduler ব্যবহার করুন।
উদাহরণ:
@EnableScheduling
@Component
public class ScheduledTask {
@Scheduled(fixedRate = 5000)
public void performTask() {
System.out.println("Task executed every 5 seconds");
}
}
Spring Framework-এর পারফরম্যান্স উন্নত করার জন্য এই টিপসগুলো বাস্তবায়ন করা হলে অ্যাপ্লিকেশন দ্রুত, কার্যকর এবং স্কেলেবল হবে। এগুলো প্রোডাকশন পরিবেশে ব্যবহারের আগে পর্যাপ্ত পরীক্ষা নিশ্চিত করুন।
Spring Caching একটি শক্তিশালী ফিচার যা অ্যাপ্লিকেশন ডেভেলপমেন্টে ক্যাশিং ব্যবস্থাপনা সহজ এবং কার্যকরী করে তোলে। ক্যাশিং হল একটি টেকনিক যা অস্থায়ীভাবে ডেটা সংরক্ষণ করে, যাতে একই ডেটার জন্য বারবার ডাটাবেস বা অন্য কোনো সোর্স থেকে রিকোয়েরি না করতে হয়। এটি অ্যাপ্লিকেশনের পারফরম্যান্স এবং প্রতিক্রিয়া সময় (response time) উন্নত করতে সাহায্য করে।
Spring Caching ফ্রেমওয়ার্ক annotation-based caching সমর্থন করে, যা সহজেই ক্যাশিং কনফিগার করা যায়। Spring Caching অনেক ক্যাশ মেকানিজমের সাথে ইন্টিগ্রেট করতে পারে, যেমন EHCache, Redis, Caffeine, Simple Map ইত্যাদি।
Spring Caching এর মূল উপাদান
- @EnableCaching: Spring Caching সক্রিয় করার জন্য ব্যবহৃত এনোটেশন।
- @Cacheable: মেথডে ক্যাশিং সক্ষম করতে ব্যবহৃত হয়।
- @CachePut: ক্যাশে আপডেট করার জন্য ব্যবহৃত হয়।
- @CacheEvict: ক্যাশে থেকে ডেটা মুছতে ব্যবহৃত হয়।
১. Spring Caching সেটআপ এবং কনফিগারেশন
প্রথমে আপনার pom.xml বা build.gradle ফাইলে Spring Caching এবং ক্যাশ মেকানিজম (যেমন Redis বা EhCache) ডিপেনডেন্সি যোগ করতে হবে।
pom.xml (Maven)
<dependencies>
<!-- Spring Cache and EhCache -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- EhCache Dependency -->
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
</dependencies>
build.gradle (Gradle)
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-cache'
implementation 'org.ehcache:ehcache'
}
২. Spring Caching Enable করা
@EnableCaching এনোটেশন ব্যবহার করে Spring Caching সক্রিয় করতে হবে।
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableCaching // Enable Spring Caching
public class CacheConfig {
// Additional cache configuration can go here (if needed)
}
৩. @Cacheable, @CachePut, @CacheEvict এর ব্যবহার
@Cacheable: ক্যাশে ডেটা রাখা
@Cacheable এনোটেশন ব্যবহার করলে একটি মেথডের রিটার্ন ভ্যালু ক্যাশে রাখা হয়। পরবর্তীবার যখন সেই মেথডটি একই আর্গুমেন্ট সহ কল হবে, তখন ক্যাশ থেকে ডেটা ফেরত আসবে, ডাটাবেস বা অন্য সোর্স থেকে আবার রিকোয়েস্ট করতে হবে না।
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Cacheable(value = "users", key = "#id") // Cache the result with 'users' cache and use the 'id' as key
public User getUserById(Long id) {
// Simulating a database call (or any expensive operation)
System.out.println("Fetching user from the database...");
return new User(id, "John Doe"); // Return a user object
}
}
ব্যাখ্যা:
- এখানে
getUserByIdমেথডটি প্রথমবার যখন কল হবে, তখন ডেটা ক্যাশে সংরক্ষিত হবে। পরবর্তীবার যখন একইidসহ কল হবে, ক্যাশ থেকে ফলস্বরূপ পাওয়া যাবে, ডাটাবেসে যাওয়ার প্রয়োজন হবে না।
@CachePut: ক্যাশে আপডেট করা
@CachePut ব্যবহার করে ক্যাশে ডেটা আপডেট করা হয়, এমনকি মেথডটি চালু থাকলেও। এটি মেথডের রিটার্ন ভ্যালু ক্যাশে আপডেট করে।
import org.springframework.cache.annotation.CachePut;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
// Simulate updating the user in the database
System.out.println("Updating user in the database...");
return user;
}
}
ব্যাখ্যা:
- এখানে
updateUserমেথডটি ব্যবহৃত হলে ক্যাশে সংশ্লিষ্ট ইউজারের ডেটা আপডেট করা হবে।
@CacheEvict: ক্যাশ থেকে ডেটা মুছে ফেলা
@CacheEvict ব্যবহার করে ক্যাশ থেকে ডেটা মুছে ফেলা হয়। এটি সাধারণত ডেটাবেসে ডেটা পরিবর্তিত হলে পুরনো ক্যাশ ডেটা মুছে ফেলতে ব্যবহৃত হয়।
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {
// Simulating user deletion from the database
System.out.println("Deleting user from the database...");
}
}
ব্যাখ্যা:
deleteUserমেথডটি কল হওয়ার পর ক্যাশ থেকে ঐ ইউজারের ডেটা মুছে যাবে, যাতে পরবর্তী সময়ে সঠিক ডেটা ফেচ করা যায়।
৪. EhCache Configuration Example
Spring Caching ব্যবহারের জন্য একটি ক্যাশ মেকানিজম কনফিগার করতে হবে। এখানে EhCache ব্যবহার করে ক্যাশ কনফিগার করার উদাহরণ দেওয়া হল।
ehcache.xml (EhCache Configuration)
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.ehcache.org/schema/ehcache
http://www.ehcache.org/schema/ehcache/2.10/ehcache.xsd"
updateCheck="false">
<cache name="users"
maxEntriesLocalHeap="1000"
eternal="false"
timeToLiveSeconds="600"
timeToIdleSeconds="300" />
</ehcache>
ব্যাখ্যা:
usersনামে একটি ক্যাশ কনফিগার করা হয়েছে যার মধ্যে ১০০০ এন্ট্রি থাকতে পারবে। এই ক্যাশে ডেটা ১০ মিনিট (600 সেকেন্ড) পর্যন্ত জীবিত থাকবে।
৫. Spring Boot Application Class
এখন, Spring Boot অ্যাপ্লিকেশন ক্লাসে CommandLineRunner ব্যবহার করে ক্যাশিং ফিচার পরীক্ষা করা যায়:
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class SpringCachingApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCachingApplication.class, args);
}
@Bean
public CommandLineRunner demo(UserService userService) {
return args -> {
// First call: fetches from database and caches it
System.out.println(userService.getUserById(1L));
// Second call: fetches from cache
System.out.println(userService.getUserById(1L));
};
}
}
ব্যাখ্যা:
- প্রথমবার যখন
getUserById(1L)মেথডটি কল হবে, এটি ডেটাবেস থেকে ডেটা নিয়ে আসবে এবং ক্যাশে সংরক্ষণ করবে। পরবর্তী কলটি ক্যাশ থেকে ডেটা ফেরত দেবে, ডাটাবেস থেকে আবার রিকোয়েস্ট করার প্রয়োজন হবে না।
সারাংশ
Spring Caching একটি শক্তিশালী ফিচার যা অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করতে ব্যবহৃত হয়। @Cacheable, @CachePut, এবং @CacheEvict এনোটেশন ব্যবহার করে আপনি সহজেই ডেটা ক্যাশ করতে, ক্যাশে আপডেট করতে এবং ক্যাশ থেকে ডেটা মুছে ফেলতে পারেন। Spring Caching Spring-managed ক্যাশ মেকানিজমের মাধ্যমে ডেটা দ্রুত অ্যাক্সেস করার সুবিধা দেয়। EhCache বা Redis এর মতো ক্যাশ মেকানিজম ব্যবহার করে ডেটাবেসের চাপ কমানো যায় এবং অ্যাপ্লিকেশনের প্রতিক্রিয়া সময় (response time) বৃদ্ধি পায়।
Read more